#include "graph.h"
#include<bits/stdc++.h>
using namespace std;
int cnt,deg[205],g[205][205],fl[205][205],fa[205],dep[205],son[205][205];
int dfs1(int p) {
    int u=++cnt;deg[u]=NumberOfRoads();
    if(p) g[p][u]=g[u][p]=1,fa[u]=p,dep[u]=dep[p]+1;
    for(int i=1;i<=deg[u];i++) {
        Move(i,2);int cc=Color(),ret=LastRoad();
        if(cc==1) {fl[u][i]=1;son[u][i]=dfs1(u);fl[son[u][i]][ret]=0;Move(ret,3);}//是树边
        if(cc==2) {fl[u][i]=2;Move(ret,2);}//是根向边
        if(cc==3) {fl[u][i]=3;Move(ret,3);}//是叶向边且不是树边
    }
    return u;
}
int now,a[205][205],col[205],ans[205];//当前模数和每条边的当前值
void dfs2(int u,int p) {
    for(int i=1;i<=deg[u];i++) if(fl[u][i]==2) {
        Move(i,col[dep[u]%now]);int cc=Color();
        for(int j=0;j<now;j++) if(j%(now/3)==a[u][i]&&col[j]==cc) {a[u][i]=j;continue;}
        Move(LastRoad(),cc);
    }
    for(int i=1;i<=deg[u];i++) if(fl[u][i]==1) {
        Move(i,col[dep[u]%now]);int ret=LastRoad();
        dfs2(son[u][i],u);Move(ret,1);
    }
}
void Inspect(int R) {
    memset(g,0x3f,sizeof(g));for(int i=1;i<=200;i++) g[i][i]=0;
    dfs1(0);now=1;
    for(int i=1;i<=5;i++) {
        for(int j=0;j<3;j++) for(int k=0;k<now;k++) col[j*now+k]=j+1;
        now*=3;dfs2(1,0);
    }
    for(int u=1;u<=cnt;u++) for(int i=1;i<=deg[u];i++) if(fl[u][i]==2) {
        int v=u;while(dep[v]>a[u][i]) v=fa[v];
        g[u][v]=g[v][u]=1;
    }
    for(int k=1;k<=cnt;k++) for(int i=1;i<=cnt;i++) for(int j=1;j<=cnt;j++) 
        g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    for(int i=1;i<=cnt;i++) for(int j=1;j<=cnt;j++) ans[g[i][j]]++;
    for(int i=1;i<=R;i++) Answer(i,ans[i]/2);
}
